//////////////////////////////////////////////////////////////////////
//
//	File:		sltestp.cpp
//	Module:		sltestp.exe
//
//	Copyright 1999-2001, Microsoft Corporation. All rights reserved.
//
//	Microsoft Research Detours Package Version 1.5 (Build 46)
//
//  Test the named-pipe-based connection to the syelog system-event logger.
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "syelog.h"

VOID MyErrExit(PCSTR pszMsg)
{
    fprintf(stderr, "Error %s: %d\n", pszMsg, GetLastError());
    exit(1);
}

DWORD main(int argc, char *argv[]) 
{ 
    HANDLE hPipe;
    SYELOG_MESSAGE Message;
    BOOL fSuccess; 
    DWORD cbWritten, dwMode; 
 
    // Try to open a named pipe; wait for it, if necessary. 

    TIME_ZONE_INFORMATION tzi;
    GetTimeZoneInformation(&tzi);
    
    for (;;) {
        hPipe = CreateFileW(SYELOG_PIPE_NAMEW,  // pipe name 
                            GENERIC_WRITE,      // write access only
                            0,                  // no sharing 
                            NULL,               // no security attributes
                            OPEN_EXISTING,      // opens existing pipe 
                            0,                  // default attributes 
                            NULL);              // no template file 
        
        // Break if the pipe handle is valid. 
         if (hPipe != INVALID_HANDLE_VALUE) 
            break; 
 
        // Exit if an error other than ERROR_PIPE_BUSY occurs. 
 
        if (GetLastError() != ERROR_PIPE_BUSY) 
            MyErrExit("Could not open pipe"); 
 
        // All pipe instances are busy, so wait for 1 seconds. 
 
        if (!WaitNamedPipeW(SYELOG_PIPE_NAMEW, 1000)) 
            MyErrExit("Could not open pipe"); 
    } 
 
    // The pipe connected; change to message-read mode. 
    dwMode = PIPE_READMODE_MESSAGE;
    fSuccess = SetNamedPipeHandleState(hPipe,    // pipe handle 
                                       &dwMode,  // new pipe mode 
                                       NULL,     // don't set maximum bytes 
                                       NULL);    // don't set maximum time 
    if (!fSuccess) 
        MyErrExit("SetNamedPipeHandleState"); 
 
    // Send a message to the pipe server. 

    strcpy(Message.szMessage, (argc > 1) ? argv[1] : "sltestp: hello world!");
    
    Message.nFacility = SYELOG_FACILITY_APPLICATION;
    Message.nSeverity = SYELOG_SEVERITY_INFORMATION;
    Message.nProcessId = GetCurrentProcessId();
    GetSystemTimeAsFileTime(&Message.ftOccurance);
    for (PCSTR pszEnd = Message.szMessage; *pszEnd; pszEnd++) {
        // no internal contents.
    }
    Message.nBytes = (USHORT)(pszEnd - ((PCSTR)&Message) + 1);
 
    fSuccess = WriteFile(hPipe,                  // pipe handle 
                         &Message,             // message 
                         Message.nBytes, // message length 
                         &cbWritten,             // bytes written 
                         NULL);                  // not overlapped 
    if (! fSuccess) 
        MyErrExit("WriteFile"); 

    CloseHandle(hPipe);
    
    GetTimeZoneInformation(&tzi);
    
    return 0; 
} 
